#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
主题: 审查清理文本字符串
问题: 一些无聊的幼稚黑客在你的网站页面表单中输入文本”pýtĥöñ”，然后你想将这些字符清理掉。
提示 :
    1. 需要执行任何复杂字符对字符的重新映射或者删除操作的话， translate() 方法会非常的快
    2. 对于简单的替换操作， str.replace() 方法通常是最快的，甚至在你需要多次调用的时候
"""
import unicodedata
import sys


def recipe1():
    """消除整个区间上的字符或者去除变音符"""
    s = 'pýtĥöñ\fis\tawesome\r\n'
    print(f"{s = }")

    # 清理空白字符
    remap = {               # 转换表格
        ord('\t'): ' ',
        ord('\f'): ' ',
        ord('\r'): None     # Deleted
    }
    a = s.translate(remap)
    print(f"{a = }")

    # 进一步构建更大的表格
    cmb_chrs = dict.fromkeys(c for c in range(
        sys.maxunicode) if unicodedata.combining(chr(c)))
    b = unicodedata.normalize('NFD', a)     # 标准化为分解形式字符
    print(f"{b = }")
    print(f"{b.translate(cmb_chrs) = }")

    # 另一种清理文本的技术涉及到I/O解码与编码函数
    print(f"{b.encode('ascii', 'ignore').decode('ascii') = }")

def recipe2():
    """构造一个将所有Unicode数字字符映射到对应的ASCII字符上的表格"""
    digitmap = {c: ord('0') + unicodedata.digit(chr(c))
                for c in range(sys.maxunicode) if unicodedata.category(chr(c)) == 'Nd'}
    print(f"{len(digitmap) = }")
    print(f"{digitmap = }")

    # Arabic digits
    x = '\u0661\u0662\u0663'
    print(f"{x.translate(digitmap) = }")

def clean_spaces(s):
    """对于简单的替换操作， str.replace() 方法通常是最快的，甚至在你需要多次调用的时候"""
    s = s.replace('\r', ' ')
    s = s.replace('\t', ' ')
    s = s.replace('\f', ' ')
    return s

def main():
    print('recipe1'.center(20, '*'))
    recipe1()
    print('recipe2'.center(20, '*'))
    recipe2()

if __name__ == '__main__':
    main()
